#ifndef REALELEMENT_H
#define REALELEMENT_H

#include <QQueue>
#include <QVector>

#include "configuredelement.h"
#include "pin.h"
#include "performelement.h"
#include "exceptions.h"

// Базовый класс для элементов с задержками
// Имеет множество входных пинов, и один выходной пин
class RealElement : public ConfiguredElement, public IPerformElement
{
    Q_OBJECT

protected:
    // Очередь сигналов, для создания задержек
    QQueue<signed char> signalQueue;

    // Задержка
    uint delay;

    // Выходной пин
    Pin* outPIN;

    // Сигнал по-умолчанию
    signed char defaultSignal;

    // Флаг выполнения полезной работы перед отправкой сигнала
    bool performed;

    //Инициализирует специфичные свойства элемента из файла конфига
    void initProps(const QDomNode& additionals);

    //Сохранить нужные свойства в конфиг
    void saveProps(QDomNode& additionals);

private:

    // Прошлые состояния пинов
    QVector<int> lastTics;

public:

    //Таблица истинности
    QVector<signed char> valuesTable;

    // Конструктор для инициализации
    RealElement();
    ~RealElement();

    //Явная инициализация
    void init(const QString& configPath);

    // Выполнить работу
    bool performAction();

    // Отправить сигнал
    bool sendSignals();

    // Обновить
    void refresh();

    //Получить задержку
    uint getDelay();

    //Установить задержку
    void setDelay(uint delay);

    //Получить сигнал по уморлчанию
    signed char getDefaultSignal();

    //Установить сигнал по умолчанию
    void setDefaultSignal(signed char signal);

    // Функция элемента
    signed char computeSignal();
};

#endif // REALELEMENT_H
